import { MenuAll, getMenu } from "@/services/common"
import getUUID from "./getUUID"

export const getInitData = async (menuType: MenuAll, token?: string) => {
  return Promise.all([
    getMenu({all: menuType}, token),
  ]).catch(() => {
    return Promise.resolve(undefined)
  })
}

export const cleanMenuData = (data: OriginMenu[]): Menu[] => {
  const toMenu = (item: OriginMenu): Menu => {
    return {
      id: item.id,
      parentId: item.parentId,
      children: [],
      hideChildrenInMenu: false,
      hideInMenu: false,
      icon: item.icon,
      component: item.path,
      name: item.cName,
      path: item.path || getUUID(),
      elementAuth: {},
    }
  }

  const res: Menu[] = []
  const _map: Record<string, Menu> = {}
  // 子菜单集合
  const childList: Menu[] = []
  // 按钮集合
  const buttonList: OriginMenu[] = []

  // 区分根菜单和页面元素
  data.forEach(item => {
    // 过滤非菜单数据
    if (!item.isButton) {
      const menu = toMenu(item)
      // 所有菜单存储到 _map 中，方便后续添加子元素
      _map[item.id] = menu
      // 根目录加入到结果集中
      if (!item.parentId) {
        res.push(menu)
      } else {
        // 子菜单
        childList.push(menu)
      }
    } else {
      // 按钮
      buttonList.push(item)
    }
  })

  // 遍历处理页面元素
  buttonList.forEach(item => {
    _map[item.parentId].elementAuth[item.eName] = item
  })

  // 遍历处理子菜单
  childList.forEach(item => {
    _map[item.parentId!]?.children.push(item)
  })

  return res
}

export type Option = {
  title: string
  label: string
  parentId: string
  key: string | number
  children: Option[]
}
export function cleanMenuDataForOption(data: OriginMenu[]): Option[] {
  const toOption = (item: OriginMenu): Option => {
    return {
      key: item.id,
      parentId: item.parentId,
      title: item.cName,
      label: item.cName,
      children: [],
    }
  }

  const res: Option[] = []
  const _map: Record<string, Option> = {}
  // 子菜单集合
  const childList: Option[] = []
  // 按钮集合
  const buttonList: Option[] = []

  // 区分根菜单和页面元素
  data.forEach(item => {
    const option = toOption(item)
    // 过滤非菜单数据
    if (!item.isButton) {
      // 所有菜单存储到 _map 中，方便后续添加子元素
      _map[item.id] = option
      // 根目录加入到结果集中
      if (!item.parentId) {
        res.push(option)
      } else {
        // 子菜单
        childList.push(option)
      }
    } else {
      // 按钮
      buttonList.push(option)
    }
  })

  // 遍历处理页面元素
  buttonList.forEach(item => {
    _map[item.parentId].children.push(item)
  })

  // 遍历处理子菜单
  childList.forEach(item => {
    _map[item.parentId!]?.children.push(item)
  })

  return res
}